//这个页面是对数据库的交互，主要是登录和注册（服务类）

// 模块导入
import database from '../../utils/database'
import bcrypt from 'bcrypt'
// 数据库中用户表的表名
const tableName = 'users'
// 定义用户信息接口
export interface UserInfo {
  id: number;
  username: string;
  role: 'normal' | 'admin';
  avatar?: string; 
}
// 用户服务类
export class UsersService {
  // 登录方法 
  login(username: string, password: string): Promise<UserInfo> {
    return new Promise((res, rej) => {
        // 读取数据库用户数据 - 添加 avatar 字段
        database.queryData(tableName, ['id', 'username', 'role', 'password', 'avatar'], `username = '${username}'`, (data)=>{
            // DB返回的是数组，直接取其中一个即可（只有一个元素）
            let result = data.result.pop();
            // 如果用户数据存在，则进行后续验证
            if (result != null) {
                let p = result.password;
                // 验证密码
                let success = bcrypt.compareSync(password, p);
                if (success) {
                    // 登录成功，返回用户数据 - 包含 avatar
                    database.updateData(tableName, 'last_login_time = NOW()', `id = ${result.id}`)
                    res({
                        id: result.id,
                        username: result.username,
                        role: result.role,
                        avatar: result.avatar // 添加这一行
                    })
                } else {
                    rej('密码错误，请重新输入')
                }
            } else {
                rej('请输入正确的账户信息')
            }
        })
    });
  }
  
  // 注册方法
  signUp(username: string, password: string, role: string): Promise<null> {
    return new Promise((res, rej) => {
        // 检查是否已经有用户存在
        database.queryData(tableName, ['id'], `username = '${username}'`, (data)=>{
            let result = data.result.pop();
            // 如果用户已经存在，则不能重复注册
            if (result != null) {
                rej('用户名已存在，请更换其他用户名注册')
            } else {
                // 对密码进行加密
                let crypt = bcrypt.hashSync(password, 10)
                // 将密码加密后的用户数据存储到数据库中
                database.insertData(tableName, ['username', 'password', 'role'], [username, crypt, role], data => {
                    if (data) {
                        res(null)
                    } else { 
                        rej('注册失败，请稍后重试')
                    }
                })
            }
        })
    });
  }

  // 修改密码方法
  changePassword(userId: number, oldPassword: string, newPassword: string): Promise<null> {
    return new Promise((res, rej) => {
      // 首先验证原密码是否正确
      database.queryData(tableName, ['id', 'password'], `id = ${userId}`, (data) => {
        let result = data.result.pop();
        if (result != null) {
          let storedPassword = result.password;
          // 验证原密码
          let success = bcrypt.compareSync(oldPassword, storedPassword);
          if (success) {
            // 原密码正确，对新密码进行加密
            let cryptNewPassword = bcrypt.hashSync(newPassword, 10);
            // 更新密码
            database.updateData(tableName, `password = '${cryptNewPassword}'`, `id = ${userId}`);
            res(null);
          } else {
            rej('原密码错误，请重新输入');
          }
        } else {
          rej('用户不存在');
        }
      });
    });
  }

  // 获取用户列表
  getUserList(offset: number = 0, limit: number = 10): Promise<{users: any[], total: number}> {
    return new Promise((resolve, reject) => {
      // 获取总数
      database.dataCount(tableName, (total: number) => {
        // 确保查询包含 avatar 字段
        database.queryData(tableName, ['id', 'username', 'role', 'avatar', 'registration_time', 'last_login_time'], '1=1', (data) => {
          if (!data || !data.result) {
            reject('获取用户数据失败');
            return;
          }
          
          let result = data.result;
          console.log('从数据库获取的用户数据（包含头像）:', result);
          
          // 分页处理
          let users = result.slice(offset, offset + limit).map((user: any) => ({
            id: user.id,
            username: user.username,
            role: user.role,
            avatar: user.avatar, // 直接使用数据库中的 avatar 字段
            registration_time: user.registration_time,
            last_login_time: user.last_login_time
          }));
          
          resolve({
            users: users,
            total: total
          });
        });
      });
    });
  }

  // 修改头像方法
  changeAvatar(userId: number, avatar: string): Promise<null> {
    return new Promise((res, _rej) => {
      database.updateData(tableName, `avatar = '${avatar}'`, `id = ${userId}`);
      res(null);
    });
  }

  // 根据ID获取用户信息
  getUserById(userId: number): Promise<UserInfo> {
    return new Promise((res, rej) => {
      database.queryData(tableName, ['id', 'username', 'role', 'avatar'], `id = ${userId}`, (data) => {
        let result = data.result.pop();
        if (result != null) {
          res({
            id: result.id,
            username: result.username,
            role: result.role,
            avatar: result.avatar
          });
        } else {
          rej('用户不存在');
        }
      });
    });
  }
}
// 导出服务类
export default new UsersService();